This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

##  INSTALL REQUIRED PACKAGES AND LIBRARIES
install.packages("sm")
Installing package into 㤼㸱C:/Users/richa/OneDrive/Documents/R/win-library/3.5㤼㸲
(as 㤼㸱lib㤼㸲 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/sm_2.2-5.6.zip'
Content type 'application/zip' length 1107195 bytes (1.1 MB)
downloaded 1.1 MB
package ‘sm’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\richa\AppData\Local\Temp\RtmpELnRzD\downloaded_packages
install.packages("ggplot2")
Installing package into 㤼㸱C:/Users/richa/OneDrive/Documents/R/win-library/3.5㤼㸲
(as 㤼㸱lib㤼㸲 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/ggplot2_3.2.0.zip'
Content type 'application/zip' length 3951642 bytes (3.8 MB)
downloaded 3.8 MB
package ‘ggplot2’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\richa\AppData\Local\Temp\RtmpELnRzD\downloaded_packages
install.packages("sqldf")
Installing package into 㤼㸱C:/Users/richa/OneDrive/Documents/R/win-library/3.5㤼㸲
(as 㤼㸱lib㤼㸲 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/sqldf_0.4-11.zip'
Content type 'application/zip' length 78177 bytes (76 KB)
downloaded 76 KB
package ‘sqldf’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\richa\AppData\Local\Temp\RtmpELnRzD\downloaded_packages
##  INSTALL LIBRARIES
library(sm)
Package 'sm', version 2.2-5.6: type help(sm) for summary information
library(ggplot2)
library(sqldf)
Loading required package: gsubfn
Loading required package: proto
Loading required package: RSQLite
getwd()
[1] "C:/Users/richa/OneDrive/Documents/Education/Stevens Institute/FE 800/Project/FE800HBS"
nrow(realDT)
[1] 38762
ncol(realDT)
[1] 7
## check date range of tweets
summary(realDT)
                 source     
 Twitter for Android:14545  
 Twitter Web Client :12182  
 Twitter for iPhone :10332  
 TweetDeck          :  483  
 TwitLonger Beta    :  405  
 Media Studio       :  156  
 (Other)            :  659  
                                                                                                                                      text      
 MAKE AMERICA GREAT AGAIN!                                                                                                              :   27  
 For all of those who have been asking about online sales the Donald J. Trump Signature Collection ties & shirts are sold @Macys.com:    5  
 PRESIDENTIAL HARASSMENT!                                                                                                               :    5  
 Success is not final failure is not fatal: it is the courage to continue that counts. -- Winston Churchill                             :    5  
                                                                                                                                        :    4  
 Achievers move forward at all times. Achievement is not a plateau it's a beginning.                                                    :    4  
 (Other)                                                                                                                                :38712  
           created_at    retweet_count    favorite_count        is_retweet        id_str         
                : 1682   Min.   :     0   0      : 2607              : 1740   Min.   :1.698e+09  
 5/1/2019 10:06 :    6   1st Qu.:    22          : 1682   1.01013E+17:    1   1st Qu.:3.581e+17  
 5/1/2019 9:56  :    6   Median :   300   1      :  682   1.15846E+17:    1   Median :5.623e+17  
 7/15/2018 13:33:    6   Mean   :  5621   2      :  404   9.84823E+16:    1   Mean   :5.958e+17  
 1/5/2015 3:26  :    5   3rd Qu.:  7716   15     :  309   FALSE      :35353   3rd Qu.:7.853e+17  
 11/20/2015 1:06:    5   Max.   :369530   12     :  305   TRUE       : 1666   Max.   :1.140e+18  
 (Other)        :37052   NA's   :1682     (Other):32773                       NA's   :1685       
nrow(stockdata)
[1] 244230
## CREATE SUBSETS OF THE STOCK DATA FOR DIFFERENT ANALYISS
overnight_ret_1_min <- subset(stockdata, overnight_1 == 1) ## select the subject of returns that are from close of business to opening of next business day
ret_1_min <- subset(stockdata, overnight_1 == 0) ## select the subset of 1 minute returns that are intraday
ret_2_min <- subset(stockdata, overnight_2 == 0) ## select the subset of 2 minute returns that are intraday
ret_5_min <- subset(stockdata, overnight_5 == 0) ## select the subset of 5 minute returns that are intraday
ret_10_min <- subset(stockdata, overnight_10 == 0) ## select the subset of 10 minute returns that are intraday
ret_20_min <- subset(stockdata, overnight_20 == 0) ## select the subset of 20 minute returns that are intraday
ret_30_min <- subset(stockdata, overnight_30 == 0) ## select the subset of 30 minute returns that are intraday
ret_60_min <- subset(stockdata, overnight_60 == 0) ## select the subset of 60 minute returns that are intraday
ret_120_min <- subset(stockdata, overnight_120 == 0) ## select the subset of 120 minute returns that are intraday
ret_240_min <- subset(stockdata, overnight_240 == 0) ## select the subset of 240 minute returns that are intraday
ret_360_min <- subset(stockdata, overnight_360 == 0) ## select the subset of 360 minute returns that are intraday
##  Statistics about 1, 2, 5, 10, 20, 30, 60, 120, 240, and 360-minute returns
max1 <- max(ret_1_min$ret_1_min) #max return
min1 <- min(ret_1_min$ret_1_min) #min return
mean1 <- mean(ret_1_min$ret_1_min) #mean
sd1 <- sd(ret_1_min$ret_1_min) #standard deviation
max2 <- max(ret_2_min$ret_2_min) #max return
min2 <- min(ret_2_min$ret_2_min) #min return
mean2 <- mean(ret_2_min$ret_2_min) #mean
sd2 <- sd(ret_2_min$ret_2_min) #standard deviation
max5 <- max(ret_5_min$ret_5_min) #max return
min5 <- min(ret_5_min$ret_5_min) #min return
mean5 <- mean(ret_5_min$ret_5_min) #mean
sd5 <- sd(ret_5_min$ret_5_min) #standard deviation
max10 <- max(ret_10_min$ret_10_min) #max return
min10 <- min(ret_10_min$ret_10_min) #min return
mean10 <- mean(ret_10_min$ret_10_min) #mean
sd10 <- sd(ret_10_min$ret_10_min) #standard deviation
max20 <- max(ret_20_min$ret_20_min) #max return
min20 <- min(ret_20_min$ret_20_min) #min return
mean20 <- mean(ret_20_min$ret_20_min) #mean
sd20 <- sd(ret_20_min$ret_20_min) #standard deviation
max30 <- max(ret_30_min$ret_30_min) #max return
min30 <- min(ret_30_min$ret_30_min) #min return
mean30 <- mean(ret_30_min$ret_30_min) #mean
sd30 <- sd(ret_30_min$ret_30_min) #standard deviation
max60 <- max(ret_60_min$ret_60_min) #max return
min60 <- min(ret_60_min$ret_60_min) #min return
mean60 <- mean(ret_60_min$ret_60_min) #mean
sd60 <- sd(ret_60_min$ret_60_min) #standard deviation
max120 <- max(ret_120_min$ret_120_min) #max return
min120 <- min(ret_120_min$ret_120_min) #min return
mean120 <- mean(ret_120_min$ret_120_min) #mean
sd120 <- sd(ret_120_min$ret_120_min) #standard deviation
max240 <- max(ret_240_min$ret_240_min) #max return
min240 <- min(ret_240_min$ret_240_min) #min return
mean240 <- mean(ret_240_min$ret_240_min) #mean
sd240 <- sd(ret_240_min$ret_240_min) #standard deviation
max360 <- max(ret_360_min$ret_360_min) #max return
min360 <- min(ret_360_min$ret_360_min) #min return
mean360 <- mean(ret_360_min$ret_360_min) #mean
sd360 <- sd(ret_360_min$ret_360_min) #standard deviation
maxon <- max(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #max return (excludes NA values)
minon <- min(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #min return (excludes NA values)
meanon <- mean(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #mean (excludes NA values)
sdon <- sd(overnight_ret_1_min$ret_1_min, na.rm=TRUE) #standard deviation (excludes NA values)
##  Create Summary Table
sumtable <- matrix(c(max1, min1, mean1, sd1, max2, min2, mean2, sd2, max5, min5, mean5, sd5, max10, min10, mean10, sd10, max20, min20, mean20, sd20, max30, min30, mean30, sd30, max60, min60, mean60, sd60, max120, min120, mean120, sd120, max240, min240, mean240, sd240, max360, min360, mean360, sd360, maxon, minon, meanon, sdon), ncol = 4, byrow = TRUE)
colnames(sumtable) <- c("Max", "Min", "Mean", "Std. Dev")
rownames(sumtable) <- c("1 Minute", "2 Minutes", "5 Minutes", "10 Minutes", "20 Minutes", "30 Minutes", "60 Minutes", "120 Minutes", "240 Minutes", "360 Minutes", "Overnight")
sumtable <- as.table(sumtable)
sumtable
                      Max           Min          Mean      Std. Dev
1 Minute     8.887780e-03 -8.002421e-03 -3.765740e-07  3.050208e-04
2 Minutes    9.158534e-03 -8.227404e-03 -9.490496e-07  4.347683e-04
5 Minutes    1.516062e-02 -1.363070e-02 -2.457301e-06  6.873840e-04
10 Minutes   2.009808e-02 -1.607326e-02 -4.835746e-06  9.660964e-04
20 Minutes   2.637849e-02 -2.055613e-02 -8.298685e-06  1.356654e-03
30 Minutes   3.001411e-02 -2.723621e-02 -8.887243e-06  1.646093e-03
60 Minutes   2.620649e-02 -2.900513e-02 -1.492826e-05  2.292182e-03
120 Minutes  3.339548e-02 -3.113897e-02 -2.113782e-05  3.195499e-03
240 Minutes  3.312860e-02 -4.056254e-02 -2.838216e-05  4.608615e-03
360 Minutes  4.342457e-02 -3.497171e-02 -7.897112e-05  5.960260e-03
Overnight    1.586192e-02 -2.077167e-02  4.550390e-04  3.982014e-03
## CREATE SUBSETS OF THE STOCK DATA THAT REPRESENTS THE TIME FRAMES AFTER DONALD TRUMP TWEETS
dt_overnight_ret_1_min <- subset(stockdata, dttweetflag == 1 & overnight_1 == 1) ## select the subset of returns that are from close of business to opening of next business day
dt_ret_1_min <- subset(stockdata, dttweetflag == 1 & overnight_1 == 0) ## select the subset of 1 minute returns that are intraday
dt_ret_2_min <- subset(stockdata, dttweetflag == 1 & overnight_2 == 0) ## select the subset of 2 minute returns that are intraday
dt_ret_5_min <- subset(stockdata, dttweetflag == 1 & overnight_5 == 0) ## select the subset of 5 minute returns that are intraday
dt_ret_10_min <- subset(stockdata, dttweetflag == 1 & overnight_10 == 0) ## select the subset of 10 minute returns that are intraday
dt_ret_20_min <- subset(stockdata, dttweetflag == 1 & overnight_20 == 0) ## select the subset of 20 minute returns that are intraday
dt_ret_30_min <- subset(stockdata, dttweetflag == 1 & overnight_30 == 0) ## select the subset of 30 minute returns that are intraday
dt_ret_60_min <- subset(stockdata, dttweetflag == 1 & overnight_60 == 0) ## select the subset of 60 minute returns that are intraday
dt_ret_120_min <- subset(stockdata, dttweetflag == 1 & overnight_120 == 0) ## select the subset of 120 minute returns that are intraday
dt_ret_240_min <- subset(stockdata, dttweetflag == 1 & overnight_240 == 0) ## select the subset of 240 minute returns that are intraday
dt_ret_360_min <- subset(stockdata, dttweetflag == 1 & overnight_360 == 0) ## select the subset of 360 minute returns that are intraday
##  Statistics about 1, 2, 5, 10, 20, 30, 60, 120, 240, and 360-minute returns
dt_max1 <- max(dt_ret_1_min$ret_1_min) #max return
dt_min1 <- min(dt_ret_1_min$ret_1_min) #min return
dt_mean1 <- mean(dt_ret_1_min$ret_1_min) #mean
dt_sd1 <- sd(dt_ret_1_min$ret_1_min) #standard deviation
dt_max2 <- max(dt_ret_2_min$ret_2_min) #max return
dt_min2 <- min(dt_ret_2_min$ret_2_min) #min return
dt_mean2 <- mean(dt_ret_2_min$ret_2_min) #mean
dt_sd2 <- sd(dt_ret_2_min$ret_2_min) #standard deviation
dt_max5 <- max(dt_ret_5_min$ret_5_min) #max return
dt_min5 <- min(dt_ret_5_min$ret_5_min) #min return
dt_mean5 <- mean(dt_ret_5_min$ret_5_min) #mean
dt_sd5 <- sd(dt_ret_5_min$ret_5_min) #standard deviation
dt_max10 <- max(dt_ret_10_min$ret_10_min) #max return
dt_min10 <- min(dt_ret_10_min$ret_10_min) #min return
dt_mean10 <- mean(dt_ret_10_min$ret_10_min) #mean
dt_sd10 <- sd(dt_ret_10_min$ret_10_min) #standard deviation
dt_max20 <- max(dt_ret_20_min$ret_20_min) #max return
dt_min20 <- min(dt_ret_20_min$ret_20_min) #min return
dt_mean20 <- mean(dt_ret_20_min$ret_20_min) #mean
dt_sd20 <- sd(dt_ret_20_min$ret_20_min) #standard deviation
dt_max30 <- max(dt_ret_30_min$ret_30_min) #max return
dt_min30 <- min(dt_ret_30_min$ret_30_min) #min return
dt_mean30 <- mean(dt_ret_30_min$ret_30_min) #mean
dt_sd30 <- sd(dt_ret_30_min$ret_30_min) #standard deviation
dt_max60 <- max(dt_ret_60_min$ret_60_min) #max return
dt_min60 <- min(dt_ret_60_min$ret_60_min) #min return
dt_mean60 <- mean(dt_ret_60_min$ret_60_min) #mean
dt_sd60 <- sd(dt_ret_60_min$ret_60_min) #standard deviation
dt_max120 <- max(dt_ret_120_min$ret_120_min) #max return
dt_min120 <- min(dt_ret_120_min$ret_120_min) #min return
dt_mean120 <- mean(dt_ret_120_min$ret_120_min) #mean
dt_sd120 <- sd(dt_ret_120_min$ret_120_min) #standard deviation
dt_max240 <- max(dt_ret_240_min$ret_240_min) #max return
dt_min240 <- min(dt_ret_240_min$ret_240_min) #min return
dt_mean240 <- mean(dt_ret_240_min$ret_240_min) #mean
dt_sd240 <- sd(dt_ret_240_min$ret_240_min) #standard deviation
dt_max360 <- max(dt_ret_360_min$ret_360_min) #max return
dt_min360 <- min(dt_ret_360_min$ret_360_min) #min return
dt_mean360 <- mean(dt_ret_360_min$ret_360_min) #mean
dt_sd360 <- sd(dt_ret_360_min$ret_360_min) #standard deviation
dt_maxon <- max(dt_overnight_ret_1_min$ret_1_min, na.rm=TRUE) #max return (excludes NA values)
dt_minon <- min(dt_overnight_ret_1_min$ret_1_min, na.rm=TRUE) #min return (excludes NA values)
dt_meanon <- mean(dt_overnight_ret_1_min$ret_1_min, na.rm=TRUE) #mean (excludes NA values)
dt_sdon <- sd(dt_overnight_ret_1_min$ret_1_min, na.rm=TRUE) #standard deviation (excludes NA values)
##  Create Summary Table
dt_sumtable <- matrix(c(dt_max1, dt_min1, dt_mean1, dt_sd1, dt_max2, dt_min2, dt_mean2, dt_sd2, dt_max5, dt_min5, dt_mean5, dt_sd5, dt_max10, dt_min10, dt_mean10, dt_sd10, dt_max20, dt_min20, dt_mean20, dt_sd20, dt_max30, dt_min30, dt_mean30, dt_sd30, dt_max60, dt_min60, dt_mean60, dt_sd60, dt_max120, dt_min120, dt_mean120, dt_sd120, dt_max240, dt_min240, dt_mean240, dt_sd240, dt_max360, dt_min360, dt_mean360, dt_sd360, dt_maxon, dt_minon, dt_meanon, dt_sdon), ncol = 4, byrow = TRUE)
colnames(dt_sumtable) <- c("Max", "Min", "Mean", "Std. Dev")
rownames(dt_sumtable) <- c("1 Minute", "2 Minutes", "5 Minutes", "10 Minutes", "20 Minutes", "30 Minutes", "60 Minutes", "120 Minutes", "240 Minutes", "360 Minutes", "Overnight")
dt_sumtable <- as.table(dt_sumtable)
dt_sumtable
                      Max           Min          Mean      Std. Dev
1 Minute     3.660874e-03 -1.933951e-03  1.230258e-06  3.228175e-04
2 Minutes    4.386453e-03 -3.823998e-03  9.388884e-06  4.587222e-04
5 Minutes    5.573376e-03 -3.241616e-03 -4.039797e-06  6.703270e-04
10 Minutes   8.301536e-03 -5.582634e-03 -1.012057e-05  9.762170e-04
20 Minutes   1.283367e-02 -7.536593e-03 -2.597216e-05  1.383106e-03
30 Minutes   1.923196e-02 -7.771127e-03 -3.454241e-05  1.671035e-03
60 Minutes   2.019042e-02 -1.091749e-02 -7.117241e-05  2.217403e-03
120 Minutes  2.034899e-02 -2.138387e-02 -2.011246e-04  3.350048e-03
240 Minutes  1.133820e-02 -2.463258e-02 -4.410137e-04  4.211982e-03
360 Minutes  9.584493e-03 -2.672889e-02 -1.213914e-03  5.940661e-03
Overnight    5.374228e-03 -5.875397e-03 -4.290851e-04  3.136684e-03
## HISTOGRAM OF MINUTE BY MINUTE STOCK RETURNS
hist(ret_1_min$ret_1_min, 
     breaks = 500,
     main = "1 Minute Intraday Returns",
     xlab = "Minute Level Returns", 
     col = "Light Blue")

##  HISTOGRAM OF OVERNIGHT STOCK RETURNS
hist(overnight_ret_1_min$ret_1_min, 
     breaks = 100,
     main = "Overnight Returns",
     xlab = "End of Trading Day to Beginning of Next Trading Day Returns", 
     col = "Red")

##  CREATE DENSITY PLOT DISTRIBUTIONS
d1 <- density(ret_1_min$ret_1_min, from = -0.05, to = 0.05)
d2 <- density(ret_2_min$ret_2_min, from = -0.05, to = 0.05)
d5 <- density(ret_5_min$ret_5_min, from = -0.05, to = 0.05)
d10 <- density(ret_10_min$ret_10_min, from = -0.05, to = 0.05)
d20 <- density(ret_20_min$ret_20_min, from = -0.05, to = 0.05)
d30 <- density(ret_30_min$ret_30_min, from = -0.05, to = 0.05)
d60 <- density(ret_60_min$ret_60_min, from = -0.05, to = 0.05)
d120 <- density(ret_120_min$ret_120_min, from = -0.05, to = 0.05)
d240 <- density(ret_240_min$ret_240_min, from = -0.05, to = 0.05)
d360 <- density(ret_360_min$ret_360_min, from = -0.05, to = 0.05)
don <- density(overnight_ret_1_min$ret_1_min, na.rm = TRUE, from = -0.05, to = 0.05) #EXCLUDE NA VALUES FROM ANALYSIS (ERROR RESULTS IF YOU DON'T DO THIS)
##  PLOT DENSITY PLOTS
plot(d1, main = "Denstiy Plot: 1 Minute Returns", xlab = "Distribution of 1 Minute Returns") 
polygon(d1, col = "Light Blue", border = "Blue")

plot(d2, main = "Denstiy Plot: 2 Minute Returns", xlab = "Distribution of 2 Minute Returns")
polygon(d2, col = "Light Blue", border = "Blue")

plot(d5, main = "Denstiy Plot: 5 Minute Returns", xlab = "Distribution of 5 Minute Returns")
polygon(d5, col = "Light Blue", border = "Blue")

plot(d10, main = "Denstiy Plot: 10 Minute Returns", xlab = "Distribution of 10 Minute Returns")
polygon(d10, col = "Light Blue", border = "Blue")

plot(d20, main = "Denstiy Plot: 20 Minute Returns", xlab = "Distribution of 20 Minute Returns")
polygon(d20, col = "Light Blue", border = "Blue")

plot(d30, main = "Denstiy Plot: 30 Minute Returns", xlab = "Distribution of 30 Minute Returns")
polygon(d30, col = "Light Blue", border = "Blue")

plot(d60, main = "Denstiy Plot: 60 Minute Returns", xlab = "Distribution of 60 Minute Returns")
polygon(d60, col = "Light Blue", border = "Blue")

plot(d120, main = "Denstiy Plot: 120 Minute Returns", xlab = "Distribution of 120 Minute Returns")
polygon(d120, col = "Light Blue", border = "Blue")

plot(d240, main = "Denstiy Plot: 240 Minute Returns", xlab = "Distribution of 240 Minute Returns")
polygon(d240, col = "Light Blue", border = "Blue")

plot(d360, main = "Denstiy Plot: 360 Minute Returns", xlab = "Distribution of 360 Minute Returns")
polygon(d360, col = "Light Blue", border = "Blue")

plot(don, main = "Denstiy Plot: Overnight Returns", xlab = "Distribution of Overnight Returns")
polygon(don, col = "Light Green", border = "Green")

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KYGBge3IgTElCUkFSSUVTIEFORCBQQUNLQUdFU30NCiMjICBJTlNUQUxMIFJFUVVJUkVEIFBBQ0tBR0VTIEFORCBMSUJSQVJJRVMNCmluc3RhbGwucGFja2FnZXMoInNtIikNCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KaW5zdGFsbC5wYWNrYWdlcygic3FsZGYiKQ0KDQoNCiMjICBJTlNUQUxMIExJQlJBUklFUw0KbGlicmFyeShzbSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3FsZGYpDQpgYGANCg0KDQpgYGB7ciBTRVQgV09SS0lORyBESVJFQ1RPUll9DQpnZXR3ZCgpDQojc2V0d2QoIkM6L1VzZXJzL2hhcnNoaWwuYi5zaGFoL0RvY3VtZW50cy9HaXRIdWIvRkU4MDBIQlMiKQ0KI3NldHdkKCJDOi9Vc2Vycy9iaW50YS5kLnBhdGVsL0RvY3VtZW50cy9HaXRIdWIvRkU4MDBIQlMvRkU4MDBIQlMiKQ0Kc2V0d2QoIkM6L1VzZXJzL3JpY2hhL09uZURyaXZlL0RvY3VtZW50cy9FZHVjYXRpb24vU3RldmVucyBJbnN0aXR1dGUvRkUgODAwL1Byb2plY3QvRkU4MDBIQlMiKQ0KDQojIyByZWFkIERvbmFsZCBUcnVtcCB0d2VldHMgZG93bmxvYWRlZCBmcm9tIHRydW1wdHdpdHRlcmFyY2hpdmUuY29tIA0KcmVhbERUIDwtIHJlYWQuY3N2KCJEb25hbGRUcnVtcFR3ZWV0cy5jc3YiLGhlYWRlciA9IFRSVUUpDQoNCmBgYA0KDQpgYGB7cn0NCiMjIHNlZSBmaXJzdCA2IHJvd3Mgb2YgdGhlIGRhdGFzZXQNCmhlYWQocmVhbERUKQ0KDQojIyB0YWlsKHJlYWxEVCkNCmBgYA0KDQpgYGB7cn0NCiMjIGNoZWNrIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zDQpucm93KHJlYWxEVCkNCm5jb2wocmVhbERUKQ0KYGBgDQoNCmBgYHtyfQ0KIyMgY2hlY2sgZGF0ZSByYW5nZSBvZiB0d2VldHMNCnN1bW1hcnkocmVhbERUKQ0KYGBgDQoNCmBgYHtyIExPQUQgU1RPQ0sgREFUQX0NCiMjICBSZWFkIFN0b2NrIERhdGENCnN0b2NrZGF0YSA8LSByZWFkLmNzdigic3RvY2tkYXRhLmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikNCiMjICBTdW1tYXJpemUgU3RvY2sgRGF0YQ0KaGVhZChzdG9ja2RhdGEpDQojIyAgTnVtYmVyIG9mIFJvd3MgaW4gc3RvY2sgbWFya2V0IGRhdGENCm5yb3coc3RvY2tkYXRhKQ0KDQpgYGANCg0KYGBge3IgU1VCU0VUIFNUT0NLIERBVEEgfQ0KIyMgQ1JFQVRFIFNVQlNFVFMgT0YgVEhFIFNUT0NLIERBVEEgRk9SIERJRkZFUkVOVCBBTkFMWUlTUw0KDQpvdmVybmlnaHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xID09IDEpICMjIHNlbGVjdCB0aGUgc3ViamVjdCBvZiByZXR1cm5zIHRoYXQgYXJlIGZyb20gY2xvc2Ugb2YgYnVzaW5lc3MgdG8gb3BlbmluZyBvZiBuZXh0IGJ1c2luZXNzIGRheQ0KcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDEgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8yX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMiA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAyIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfNV9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzUgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNSBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzEwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMTAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8yMF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzIwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfMzBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8zMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzMCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzYwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfNjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCnJldF8xMjBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIG92ZXJuaWdodF8xMjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMTIwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpyZXRfMjQwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBvdmVybmlnaHRfMjQwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDI0MCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KcmV0XzM2MF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgb3Zlcm5pZ2h0XzM2MCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzNjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCg0KYGBgDQoNCmBgYHtyIFNUQVRJU1RJQ1N9DQojIyAgU3RhdGlzdGljcyBhYm91dCAxLCAyLCA1LCAxMCwgMjAsIDMwLCA2MCwgMTIwLCAyNDAsIGFuZCAzNjAtbWludXRlIHJldHVybnMNCm1heDEgPC0gbWF4KHJldF8xX21pbiRyZXRfMV9taW4pICNtYXggcmV0dXJuDQptaW4xIDwtIG1pbihyZXRfMV9taW4kcmV0XzFfbWluKSAjbWluIHJldHVybg0KbWVhbjEgPC0gbWVhbihyZXRfMV9taW4kcmV0XzFfbWluKSAjbWVhbg0Kc2QxIDwtIHNkKHJldF8xX21pbiRyZXRfMV9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MiA8LSBtYXgocmV0XzJfbWluJHJldF8yX21pbikgI21heCByZXR1cm4NCm1pbjIgPC0gbWluKHJldF8yX21pbiRyZXRfMl9taW4pICNtaW4gcmV0dXJuDQptZWFuMiA8LSBtZWFuKHJldF8yX21pbiRyZXRfMl9taW4pICNtZWFuDQpzZDIgPC0gc2QocmV0XzJfbWluJHJldF8yX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXg1IDwtIG1heChyZXRfNV9taW4kcmV0XzVfbWluKSAjbWF4IHJldHVybg0KbWluNSA8LSBtaW4ocmV0XzVfbWluJHJldF81X21pbikgI21pbiByZXR1cm4NCm1lYW41IDwtIG1lYW4ocmV0XzVfbWluJHJldF81X21pbikgI21lYW4NCnNkNSA8LSBzZChyZXRfNV9taW4kcmV0XzVfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDEwIDwtIG1heChyZXRfMTBfbWluJHJldF8xMF9taW4pICNtYXggcmV0dXJuDQptaW4xMCA8LSBtaW4ocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjbWluIHJldHVybg0KbWVhbjEwIDwtIG1lYW4ocmV0XzEwX21pbiRyZXRfMTBfbWluKSAjbWVhbg0Kc2QxMCA8LSBzZChyZXRfMTBfbWluJHJldF8xMF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MjAgPC0gbWF4KHJldF8yMF9taW4kcmV0XzIwX21pbikgI21heCByZXR1cm4NCm1pbjIwIDwtIG1pbihyZXRfMjBfbWluJHJldF8yMF9taW4pICNtaW4gcmV0dXJuDQptZWFuMjAgPC0gbWVhbihyZXRfMjBfbWluJHJldF8yMF9taW4pICNtZWFuDQpzZDIwIDwtIHNkKHJldF8yMF9taW4kcmV0XzIwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgzMCA8LSBtYXgocmV0XzMwX21pbiRyZXRfMzBfbWluKSAjbWF4IHJldHVybg0KbWluMzAgPC0gbWluKHJldF8zMF9taW4kcmV0XzMwX21pbikgI21pbiByZXR1cm4NCm1lYW4zMCA8LSBtZWFuKHJldF8zMF9taW4kcmV0XzMwX21pbikgI21lYW4NCnNkMzAgPC0gc2QocmV0XzMwX21pbiRyZXRfMzBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDYwIDwtIG1heChyZXRfNjBfbWluJHJldF82MF9taW4pICNtYXggcmV0dXJuDQptaW42MCA8LSBtaW4ocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjbWluIHJldHVybg0KbWVhbjYwIDwtIG1lYW4ocmV0XzYwX21pbiRyZXRfNjBfbWluKSAjbWVhbg0Kc2Q2MCA8LSBzZChyZXRfNjBfbWluJHJldF82MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4MTIwIDwtIG1heChyZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI21heCByZXR1cm4NCm1pbjEyMCA8LSBtaW4ocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNtaW4gcmV0dXJuDQptZWFuMTIwIDwtIG1lYW4ocmV0XzEyMF9taW4kcmV0XzEyMF9taW4pICNtZWFuDQpzZDEyMCA8LSBzZChyZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQptYXgyNDAgPC0gbWF4KHJldF8yNDBfbWluJHJldF8yNDBfbWluKSAjbWF4IHJldHVybg0KbWluMjQwIDwtIG1pbihyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI21pbiByZXR1cm4NCm1lYW4yNDAgPC0gbWVhbihyZXRfMjQwX21pbiRyZXRfMjQwX21pbikgI21lYW4NCnNkMjQwIDwtIHNkKHJldF8yNDBfbWluJHJldF8yNDBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCm1heDM2MCA8LSBtYXgocmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNtYXggcmV0dXJuDQptaW4zNjAgPC0gbWluKHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjbWluIHJldHVybg0KbWVhbjM2MCA8LSBtZWFuKHJldF8zNjBfbWluJHJldF8zNjBfbWluKSAjbWVhbg0Kc2QzNjAgPC0gc2QocmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KbWF4b24gPC0gbWF4KG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjbWF4IHJldHVybiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0KbWlub24gPC0gbWluKG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjbWluIHJldHVybiAoZXhjbHVkZXMgTkEgdmFsdWVzKQ0KbWVhbm9uIDwtIG1lYW4ob3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNtZWFuIChleGNsdWRlcyBOQSB2YWx1ZXMpDQpzZG9uIDwtIHNkKG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybT1UUlVFKSAjc3RhbmRhcmQgZGV2aWF0aW9uIChleGNsdWRlcyBOQSB2YWx1ZXMpDQoNCg0KYGBgDQoNCmBgYHtyIFNVTU1BUlkgVEFCTEUgV0lUSCBTVEFUSVNUSUNTIFJFU1VMVFN9DQojIyAgQ3JlYXRlIFN1bW1hcnkgVGFibGUNCg0Kc3VtdGFibGUgPC0gbWF0cml4KGMobWF4MSwgbWluMSwgbWVhbjEsIHNkMSwgbWF4MiwgbWluMiwgbWVhbjIsIHNkMiwgbWF4NSwgbWluNSwgbWVhbjUsIHNkNSwgbWF4MTAsIG1pbjEwLCBtZWFuMTAsIHNkMTAsIG1heDIwLCBtaW4yMCwgbWVhbjIwLCBzZDIwLCBtYXgzMCwgbWluMzAsIG1lYW4zMCwgc2QzMCwgbWF4NjAsIG1pbjYwLCBtZWFuNjAsIHNkNjAsIG1heDEyMCwgbWluMTIwLCBtZWFuMTIwLCBzZDEyMCwgbWF4MjQwLCBtaW4yNDAsIG1lYW4yNDAsIHNkMjQwLCBtYXgzNjAsIG1pbjM2MCwgbWVhbjM2MCwgc2QzNjAsIG1heG9uLCBtaW5vbiwgbWVhbm9uLCBzZG9uKSwgbmNvbCA9IDQsIGJ5cm93ID0gVFJVRSkNCmNvbG5hbWVzKHN1bXRhYmxlKSA8LSBjKCJNYXgiLCAiTWluIiwgIk1lYW4iLCAiU3RkLiBEZXYiKQ0Kcm93bmFtZXMoc3VtdGFibGUpIDwtIGMoIjEgTWludXRlIiwgIjIgTWludXRlcyIsICI1IE1pbnV0ZXMiLCAiMTAgTWludXRlcyIsICIyMCBNaW51dGVzIiwgIjMwIE1pbnV0ZXMiLCAiNjAgTWludXRlcyIsICIxMjAgTWludXRlcyIsICIyNDAgTWludXRlcyIsICIzNjAgTWludXRlcyIsICJPdmVybmlnaHQiKQ0Kc3VtdGFibGUgPC0gYXMudGFibGUoc3VtdGFibGUpDQpzdW10YWJsZQ0KYGBgDQoNCg0KDQoNCmBgYHtyIERUIFRXRUVUIFNUT0NLREFUQX0NCiMjIENSRUFURSBTVUJTRVRTIE9GIFRIRSBTVE9DSyBEQVRBIFRIQVQgUkVQUkVTRU5UUyBUSEUgVElNRSBGUkFNRVMgQUZURVIgRE9OQUxEIFRSVU1QIFRXRUVUUw0KDQpkdF9vdmVybmlnaHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMSA9PSAxKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiByZXR1cm5zIHRoYXQgYXJlIGZyb20gY2xvc2Ugb2YgYnVzaW5lc3MgdG8gb3BlbmluZyBvZiBuZXh0IGJ1c2luZXNzIGRheQ0KZHRfcmV0XzFfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMSA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAxIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMl9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSAmIG92ZXJuaWdodF8yID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDIgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF81X21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzUgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgNSBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzEwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzEwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDEwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMjBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF8zMF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSAmIG92ZXJuaWdodF8zMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAzMCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzYwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzYwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDYwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpkdF9yZXRfMTIwX21pbiA8LSBzdWJzZXQoc3RvY2tkYXRhLCBkdHR3ZWV0ZmxhZyA9PSAxICYgb3Zlcm5pZ2h0XzEyMCA9PSAwKSAjIyBzZWxlY3QgdGhlIHN1YnNldCBvZiAxMjAgbWludXRlIHJldHVybnMgdGhhdCBhcmUgaW50cmFkYXkNCmR0X3JldF8yNDBfbWluIDwtIHN1YnNldChzdG9ja2RhdGEsIGR0dHdlZXRmbGFnID09IDEgJiBvdmVybmlnaHRfMjQwID09IDApICMjIHNlbGVjdCB0aGUgc3Vic2V0IG9mIDI0MCBtaW51dGUgcmV0dXJucyB0aGF0IGFyZSBpbnRyYWRheQ0KZHRfcmV0XzM2MF9taW4gPC0gc3Vic2V0KHN0b2NrZGF0YSwgZHR0d2VldGZsYWcgPT0gMSAmIG92ZXJuaWdodF8zNjAgPT0gMCkgIyMgc2VsZWN0IHRoZSBzdWJzZXQgb2YgMzYwIG1pbnV0ZSByZXR1cm5zIHRoYXQgYXJlIGludHJhZGF5DQpgYGANCg0KYGBge3IgU1RBVElTVElDUyBEVH0NCiMjICBTdGF0aXN0aWNzIGFib3V0IDEsIDIsIDUsIDEwLCAyMCwgMzAsIDYwLCAxMjAsIDI0MCwgYW5kIDM2MC1taW51dGUgcmV0dXJucw0KZHRfbWF4MSA8LSBtYXgoZHRfcmV0XzFfbWluJHJldF8xX21pbikgI21heCByZXR1cm4NCmR0X21pbjEgPC0gbWluKGR0X3JldF8xX21pbiRyZXRfMV9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuMSA8LSBtZWFuKGR0X3JldF8xX21pbiRyZXRfMV9taW4pICNtZWFuDQpkdF9zZDEgPC0gc2QoZHRfcmV0XzFfbWluJHJldF8xX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXgyIDwtIG1heChkdF9yZXRfMl9taW4kcmV0XzJfbWluKSAjbWF4IHJldHVybg0KZHRfbWluMiA8LSBtaW4oZHRfcmV0XzJfbWluJHJldF8yX21pbikgI21pbiByZXR1cm4NCmR0X21lYW4yIDwtIG1lYW4oZHRfcmV0XzJfbWluJHJldF8yX21pbikgI21lYW4NCmR0X3NkMiA8LSBzZChkdF9yZXRfMl9taW4kcmV0XzJfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmR0X21heDUgPC0gbWF4KGR0X3JldF81X21pbiRyZXRfNV9taW4pICNtYXggcmV0dXJuDQpkdF9taW41IDwtIG1pbihkdF9yZXRfNV9taW4kcmV0XzVfbWluKSAjbWluIHJldHVybg0KZHRfbWVhbjUgPC0gbWVhbihkdF9yZXRfNV9taW4kcmV0XzVfbWluKSAjbWVhbg0KZHRfc2Q1IDwtIHNkKGR0X3JldF81X21pbiRyZXRfNV9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KZHRfbWF4MTAgPC0gbWF4KGR0X3JldF8xMF9taW4kcmV0XzEwX21pbikgI21heCByZXR1cm4NCmR0X21pbjEwIDwtIG1pbihkdF9yZXRfMTBfbWluJHJldF8xMF9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuMTAgPC0gbWVhbihkdF9yZXRfMTBfbWluJHJldF8xMF9taW4pICNtZWFuDQpkdF9zZDEwIDwtIHNkKGR0X3JldF8xMF9taW4kcmV0XzEwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXgyMCA8LSBtYXgoZHRfcmV0XzIwX21pbiRyZXRfMjBfbWluKSAjbWF4IHJldHVybg0KZHRfbWluMjAgPC0gbWluKGR0X3JldF8yMF9taW4kcmV0XzIwX21pbikgI21pbiByZXR1cm4NCmR0X21lYW4yMCA8LSBtZWFuKGR0X3JldF8yMF9taW4kcmV0XzIwX21pbikgI21lYW4NCmR0X3NkMjAgPC0gc2QoZHRfcmV0XzIwX21pbiRyZXRfMjBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmR0X21heDMwIDwtIG1heChkdF9yZXRfMzBfbWluJHJldF8zMF9taW4pICNtYXggcmV0dXJuDQpkdF9taW4zMCA8LSBtaW4oZHRfcmV0XzMwX21pbiRyZXRfMzBfbWluKSAjbWluIHJldHVybg0KZHRfbWVhbjMwIDwtIG1lYW4oZHRfcmV0XzMwX21pbiRyZXRfMzBfbWluKSAjbWVhbg0KZHRfc2QzMCA8LSBzZChkdF9yZXRfMzBfbWluJHJldF8zMF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KZHRfbWF4NjAgPC0gbWF4KGR0X3JldF82MF9taW4kcmV0XzYwX21pbikgI21heCByZXR1cm4NCmR0X21pbjYwIDwtIG1pbihkdF9yZXRfNjBfbWluJHJldF82MF9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuNjAgPC0gbWVhbihkdF9yZXRfNjBfbWluJHJldF82MF9taW4pICNtZWFuDQpkdF9zZDYwIDwtIHNkKGR0X3JldF82MF9taW4kcmV0XzYwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXgxMjAgPC0gbWF4KGR0X3JldF8xMjBfbWluJHJldF8xMjBfbWluKSAjbWF4IHJldHVybg0KZHRfbWluMTIwIDwtIG1pbihkdF9yZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI21pbiByZXR1cm4NCmR0X21lYW4xMjAgPC0gbWVhbihkdF9yZXRfMTIwX21pbiRyZXRfMTIwX21pbikgI21lYW4NCmR0X3NkMTIwIDwtIHNkKGR0X3JldF8xMjBfbWluJHJldF8xMjBfbWluKSAjc3RhbmRhcmQgZGV2aWF0aW9uDQoNCmR0X21heDI0MCA8LSBtYXgoZHRfcmV0XzI0MF9taW4kcmV0XzI0MF9taW4pICNtYXggcmV0dXJuDQpkdF9taW4yNDAgPC0gbWluKGR0X3JldF8yNDBfbWluJHJldF8yNDBfbWluKSAjbWluIHJldHVybg0KZHRfbWVhbjI0MCA8LSBtZWFuKGR0X3JldF8yNDBfbWluJHJldF8yNDBfbWluKSAjbWVhbg0KZHRfc2QyNDAgPC0gc2QoZHRfcmV0XzI0MF9taW4kcmV0XzI0MF9taW4pICNzdGFuZGFyZCBkZXZpYXRpb24NCg0KZHRfbWF4MzYwIDwtIG1heChkdF9yZXRfMzYwX21pbiRyZXRfMzYwX21pbikgI21heCByZXR1cm4NCmR0X21pbjM2MCA8LSBtaW4oZHRfcmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNtaW4gcmV0dXJuDQpkdF9tZWFuMzYwIDwtIG1lYW4oZHRfcmV0XzM2MF9taW4kcmV0XzM2MF9taW4pICNtZWFuDQpkdF9zZDM2MCA8LSBzZChkdF9yZXRfMzYwX21pbiRyZXRfMzYwX21pbikgI3N0YW5kYXJkIGRldmlhdGlvbg0KDQpkdF9tYXhvbiA8LSBtYXgoZHRfb3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNtYXggcmV0dXJuIChleGNsdWRlcyBOQSB2YWx1ZXMpDQpkdF9taW5vbiA8LSBtaW4oZHRfb3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNtaW4gcmV0dXJuIChleGNsdWRlcyBOQSB2YWx1ZXMpDQpkdF9tZWFub24gPC0gbWVhbihkdF9vdmVybmlnaHRfcmV0XzFfbWluJHJldF8xX21pbiwgbmEucm09VFJVRSkgI21lYW4gKGV4Y2x1ZGVzIE5BIHZhbHVlcykNCmR0X3Nkb24gPC0gc2QoZHRfb3Zlcm5pZ2h0X3JldF8xX21pbiRyZXRfMV9taW4sIG5hLnJtPVRSVUUpICNzdGFuZGFyZCBkZXZpYXRpb24gKGV4Y2x1ZGVzIE5BIHZhbHVlcykNCg0KDQpgYGANCg0KYGBge3IgU1VNTUFSWSBUQUJMRSBXSVRIIFNUQVRJU1RJQ1MgUkVTVUxUUyBEVH0NCiMjICBDcmVhdGUgU3VtbWFyeSBUYWJsZQ0KDQpkdF9zdW10YWJsZSA8LSBtYXRyaXgoYyhkdF9tYXgxLCBkdF9taW4xLCBkdF9tZWFuMSwgZHRfc2QxLCBkdF9tYXgyLCBkdF9taW4yLCBkdF9tZWFuMiwgZHRfc2QyLCBkdF9tYXg1LCBkdF9taW41LCBkdF9tZWFuNSwgZHRfc2Q1LCBkdF9tYXgxMCwgZHRfbWluMTAsIGR0X21lYW4xMCwgZHRfc2QxMCwgZHRfbWF4MjAsIGR0X21pbjIwLCBkdF9tZWFuMjAsIGR0X3NkMjAsIGR0X21heDMwLCBkdF9taW4zMCwgZHRfbWVhbjMwLCBkdF9zZDMwLCBkdF9tYXg2MCwgZHRfbWluNjAsIGR0X21lYW42MCwgZHRfc2Q2MCwgZHRfbWF4MTIwLCBkdF9taW4xMjAsIGR0X21lYW4xMjAsIGR0X3NkMTIwLCBkdF9tYXgyNDAsIGR0X21pbjI0MCwgZHRfbWVhbjI0MCwgZHRfc2QyNDAsIGR0X21heDM2MCwgZHRfbWluMzYwLCBkdF9tZWFuMzYwLCBkdF9zZDM2MCwgZHRfbWF4b24sIGR0X21pbm9uLCBkdF9tZWFub24sIGR0X3Nkb24pLCBuY29sID0gNCwgYnlyb3cgPSBUUlVFKQ0KY29sbmFtZXMoZHRfc3VtdGFibGUpIDwtIGMoIk1heCIsICJNaW4iLCAiTWVhbiIsICJTdGQuIERldiIpDQpyb3duYW1lcyhkdF9zdW10YWJsZSkgPC0gYygiMSBNaW51dGUiLCAiMiBNaW51dGVzIiwgIjUgTWludXRlcyIsICIxMCBNaW51dGVzIiwgIjIwIE1pbnV0ZXMiLCAiMzAgTWludXRlcyIsICI2MCBNaW51dGVzIiwgIjEyMCBNaW51dGVzIiwgIjI0MCBNaW51dGVzIiwgIjM2MCBNaW51dGVzIiwgIk92ZXJuaWdodCIpDQpkdF9zdW10YWJsZSA8LSBhcy50YWJsZShkdF9zdW10YWJsZSkNCmR0X3N1bXRhYmxlDQpgYGANCg0KDQoNCmBgYHtyIEhJU1RPR1JBTVN9DQoNCiMjIEhJU1RPR1JBTSBPRiBNSU5VVEUgQlkgTUlOVVRFIFNUT0NLIFJFVFVSTlMNCg0KaGlzdChyZXRfMV9taW4kcmV0XzFfbWluLCANCiAgICAgYnJlYWtzID0gNTAwLA0KICAgICBtYWluID0gIjEgTWludXRlIEludHJhZGF5IFJldHVybnMiLA0KICAgICB4bGFiID0gIk1pbnV0ZSBMZXZlbCBSZXR1cm5zIiwgDQogICAgIGNvbCA9ICJMaWdodCBCbHVlIikNCg0KIyMgIEhJU1RPR1JBTSBPRiBPVkVSTklHSFQgU1RPQ0sgUkVUVVJOUw0KDQpoaXN0KG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCANCiAgICAgYnJlYWtzID0gMTAwLA0KICAgICBtYWluID0gIk92ZXJuaWdodCBSZXR1cm5zIiwNCiAgICAgeGxhYiA9ICJFbmQgb2YgVHJhZGluZyBEYXkgdG8gQmVnaW5uaW5nIG9mIE5leHQgVHJhZGluZyBEYXkgUmV0dXJucyIsIA0KICAgICBjb2wgPSAiUmVkIikNCg0KYGBgDQoNCmBgYHtyIERFTlNJVFkgUExPVFN9DQoNCiMjICBDUkVBVEUgREVOU0lUWSBQTE9UIERJU1RSSUJVVElPTlMNCg0KZDEgPC0gZGVuc2l0eShyZXRfMV9taW4kcmV0XzFfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQyIDwtIGRlbnNpdHkocmV0XzJfbWluJHJldF8yX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkNSA8LSBkZW5zaXR5KHJldF81X21pbiRyZXRfNV9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDEwIDwtIGRlbnNpdHkocmV0XzEwX21pbiRyZXRfMTBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQyMCA8LSBkZW5zaXR5KHJldF8yMF9taW4kcmV0XzIwX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkMzAgPC0gZGVuc2l0eShyZXRfMzBfbWluJHJldF8zMF9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDYwIDwtIGRlbnNpdHkocmV0XzYwX21pbiRyZXRfNjBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmQxMjAgPC0gZGVuc2l0eShyZXRfMTIwX21pbiRyZXRfMTIwX21pbiwgZnJvbSA9IC0wLjA1LCB0byA9IDAuMDUpDQpkMjQwIDwtIGRlbnNpdHkocmV0XzI0MF9taW4kcmV0XzI0MF9taW4sIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KQ0KZDM2MCA8LSBkZW5zaXR5KHJldF8zNjBfbWluJHJldF8zNjBfbWluLCBmcm9tID0gLTAuMDUsIHRvID0gMC4wNSkNCmRvbiA8LSBkZW5zaXR5KG92ZXJuaWdodF9yZXRfMV9taW4kcmV0XzFfbWluLCBuYS5ybSA9IFRSVUUsIGZyb20gPSAtMC4wNSwgdG8gPSAwLjA1KSAjRVhDTFVERSBOQSBWQUxVRVMgRlJPTSBBTkFMWVNJUyAoRVJST1IgUkVTVUxUUyBJRiBZT1UgRE9OJ1QgRE8gVEhJUykNCg0KDQojIyAgUExPVCBERU5TSVRZIFBMT1RTDQoNCnBsb3QoZDEsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAxIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMSBNaW51dGUgUmV0dXJucyIpIA0KcG9seWdvbihkMSwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQyLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMiBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDIgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMiwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQ1LCBtYWluID0gIkRlbnN0aXkgUGxvdDogNSBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDUgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkNSwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQxMCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDEwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMTAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMTAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkMjAsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAyMCBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDIwIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDIwLCBjb2wgPSAiTGlnaHQgQmx1ZSIsIGJvcmRlciA9ICJCbHVlIikNCnBsb3QoZDMwLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMzAgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiAzMCBNaW51dGUgUmV0dXJucyIpDQpwb2x5Z29uKGQzMCwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQ2MCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDYwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgNjAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkNjAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkMTIwLCBtYWluID0gIkRlbnN0aXkgUGxvdDogMTIwIE1pbnV0ZSBSZXR1cm5zIiwgeGxhYiA9ICJEaXN0cmlidXRpb24gb2YgMTIwIE1pbnV0ZSBSZXR1cm5zIikNCnBvbHlnb24oZDEyMCwgY29sID0gIkxpZ2h0IEJsdWUiLCBib3JkZXIgPSAiQmx1ZSIpDQpwbG90KGQyNDAsIG1haW4gPSAiRGVuc3RpeSBQbG90OiAyNDAgTWludXRlIFJldHVybnMiLCB4bGFiID0gIkRpc3RyaWJ1dGlvbiBvZiAyNDAgTWludXRlIFJldHVybnMiKQ0KcG9seWdvbihkMjQwLCBjb2wgPSAiTGlnaHQgQmx1ZSIsIGJvcmRlciA9ICJCbHVlIikNCnBsb3QoZDM2MCwgbWFpbiA9ICJEZW5zdGl5IFBsb3Q6IDM2MCBNaW51dGUgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIDM2MCBNaW51dGUgUmV0dXJucyIpDQpwb2x5Z29uKGQzNjAsIGNvbCA9ICJMaWdodCBCbHVlIiwgYm9yZGVyID0gIkJsdWUiKQ0KcGxvdChkb24sIG1haW4gPSAiRGVuc3RpeSBQbG90OiBPdmVybmlnaHQgUmV0dXJucyIsIHhsYWIgPSAiRGlzdHJpYnV0aW9uIG9mIE92ZXJuaWdodCBSZXR1cm5zIikNCnBvbHlnb24oZG9uLCBjb2wgPSAiTGlnaHQgR3JlZW4iLCBib3JkZXIgPSAiR3JlZW4iKQ0KDQpgYGANCg0KYGBge3J9DQojIyBMT0FEIFRSVU1QIFRXRUVUUw0KDQpkdCA8LSByZWFkLmNzdigiZHRfdHdlZXRzLmNzdiIsIHNlcCA9ICIsIiwgaGVhZGVyID0gVFJVRSkNCmR0DQoNCmBgYA0KDQpgYGB7ciBUUlVNUCBUV0VFVCBEQVRBIFBST0ZJTElOR30NCiMjICBEQVRBIFBST0ZJTElORyBVU0lORyBTUUxERg0KDQojIyAgTnVtYmVyIG9mIFR3ZWV0cyBpbiB0aGUgRGF0YSBTZXQNCnNxbGRmKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBkdCIpDQoNCmBgYA0KDQpgYGB7ciBDT1VOVCBPRiBUV0VFVFMgSU4gLyBPVVQgT0YgVFJBRElORyBIT1VSU30NCg0KIyMgIE51bWJlciBvZiBUd2VldHMgRHVyaW5nIC8gT3V0c2lkZSBvZiBUcmFkaW5nIEhvdXJzDQpzcWxkZigiU0VMRUNUIERVUklOR1RSQURJTkdIT1VSUywgQ09VTlQoKikNCiAgICAgIEZST00gZHQNCiAgICAgIEdST1VQIEJZIDEiKQ0KYGBgDQoNCmBgYHtyIEJBUiBQTE9UIE9GIFRSVU1QUyBUV0VFVFMgUEVSIEhPVVJ9DQoNCg0KIyMgIE51bWJlciBvZiBUd2VldHMgUGVyIEhvdXIgb2YgdGhlIERheQ0KRFQxIDwtIHNxbGRmKCdTRUxFQ1QgSE9VUiwgQ09VTlQoKikgYXMgbnVtdHdlZXRzIA0KICAgICAgRlJPTSBkdCANCiAgICAgIEdST1VQIEJZIGhvdXInKQ0KDQp4IDwtIDA6MjMgIyBORUVERUQgSU4gUExPVCBCRUxPVyBUTyBDUkVBVEUgWCBBWElTDQoNCmJhcnBsb3QoRFQxJG51bXR3ZWV0cywgDQogICAgICAgIG1haW4gPSAiRG9uYWxkIFRydW1wIFR3ZWV0cyBieSBIb3VyIG9mIHRoZSBEYXkiLA0KICAgICAgICB4bGFiID0gIkhvdXIgb2YgdGhlIERheSIsIA0KICAgICAgICB5bGFiID0gIk51bWJlciBvZiBUd2VldHMiLA0KICAgICAgICBjb2wgPSAibGlnaHQgYmx1ZSIsDQogICAgICAgIG5hbWVzLmFyZyA9IGMoeCksDQogICAgICAgIGNleC5sYWI9MSkNCmBgYA0KDQpgYGB7cn0NCg0KIyMgTnVtYmVyIG9mIFR3ZWV0cyBieSBZZWFyIGFuZCBNb250aA0KRFQyIDwtIHNxbGRmKCdTRUxFQ1QgWUVBUiwgTU9OVEgsIERBVEUsIENPVU5UKCopIGFzIG51bXR3ZWV0cw0KICAgICAgRlJPTSBkdA0KICAgICAgR1JPVVAgQlkgMSwgMiwgMycpDQoNCnBsb3QoRFQyJG51bXR3ZWV0cyx0eXBlID0gImwiLCANCiAgICAgbWFpbiA9ICJOdW1iZXIgb2YgVHdlZXRzIGJ5IERheSIsIA0KICAgICB4bGFiID0gIkRheSIsIA0KICAgICB5bGFiID0gIk51bWJlciBvZiBUd2VldHMiLCANCiAgICAgY29sID0gIkJsdWUiKQ0KDQpgYGANCg0K